package Servicios;

import DAO.DAOAlumno_PE;
import DAO.DAOAsignaturasAlumno;
import DAO.DAOAsignaturasOptativasAlumno;
import DAO.DAOCuentas;
import DAO.DAOInformacionAlumno;
import DAO.DAOInformacionPersonal;
import DAO.DAORelacionAlumnoProgramaEducativo;
import Dominio.Alumno;
import Dominio.CuentaSesion;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class GestorDeCuentasDeAlumno extends HttpServlet {

    private final String ID_REGISTRO_CUENTA_ALUMNO = "registrarCuentaAlumno";
    private final String ID_BUSQUEDA_ALUMNO = "buscarAlumno";
    private final String ID_MODIFICACION_CONTRASENIA_ALUMNO = "modificarContraseniaAlumno";
    private final String ID_ELIMINACION_CUENTA_ALUMNO = "eliminarCuentaAlumno";
    private final int PRIVILEGIO_ALUMNO = 2;
    
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        String peticion = request.getParameter("id");
        
        if(peticion != null){

            if(peticion.equals(ID_REGISTRO_CUENTA_ALUMNO)){
                registrarCuentaDeAlumno(request, response);
            }
            else if(peticion.equals(ID_BUSQUEDA_ALUMNO)){
                buscarCuentaDeAlumno(request, response);
            }
            else if(peticion.equals(ID_MODIFICACION_CONTRASENIA_ALUMNO)){
                modificarContraseniaDeAlumno(request, response);
            }
            else if(peticion.equals(ID_ELIMINACION_CUENTA_ALUMNO)){
                eliminarCuentaDeAlumno(request, response);
            }
            
        }
        else{
            PrintWriter out = null;
            try {
                out = response.getWriter();
                out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
            } catch (IOException ex) {                
                out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
            } finally {
                out.close();
            }
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    
    private void registrarCuentaDeAlumno(HttpServletRequest request, HttpServletResponse response){
        PrintWriter out = null;
        try {
            out = response.getWriter();
            
            String nombreDeUsuario = request.getParameter("nombre_usuario");
            String contrasenia = request.getParameter("contrasenia");
            String claveProgramaEducativoEnCadena = request.getParameter("clave_pe");            
            String nombres = request.getParameter("nombres");
            String apellidoPaterno = request.getParameter("apellido_paterno");
            String apellidoMaterno = request.getParameter("apellido_materno");
            String edad = request.getParameter("edad");
            String direccion = request.getParameter("direccion");
            String telefono = request.getParameter("telefono");
            String sexo = request.getParameter("sexo");
            
            if(nombres != null && apellidoPaterno != null && apellidoMaterno != null && edad != null && claveProgramaEducativoEnCadena != null
            && direccion != null && telefono != null && sexo != null && nombreDeUsuario != null && contrasenia != null){
                
                int claveProgramaEducativo = Integer.parseInt(claveProgramaEducativoEnCadena);
                
                Alumno alumno = new Alumno();
                alumno.setNombres(nombres);
                alumno.setApellidoPaterno(apellidoPaterno);
                alumno.setApellidoMaterno(apellidoMaterno);
                alumno.setEdad(Integer.parseInt(edad)); 
                alumno.setDireccion(direccion);
                alumno.setTelefono(telefono);
                alumno.setSexo(sexo); 
                
                CuentaSesion cuentaSesion = new CuentaSesion();
                cuentaSesion.setNombreUsuario(nombreDeUsuario);
                cuentaSesion.setContrasenia(contrasenia); 
                
                alumno.setCuentaSesion(cuentaSesion); 
                
                DAOCuentas daoCuentas = new DAOCuentas();
                
                if(!daoCuentas.existeCuenta(nombreDeUsuario)){
                    
                    DAOInformacionPersonal daoInformacionPersonal = new DAOInformacionPersonal();
                    int idInformacionPersonal = daoInformacionPersonal.registrarPersona(alumno);
                    daoInformacionPersonal.cerrarConexionAPersonas();                                                            
                    
                    daoCuentas.registrarCuenta(cuentaSesion, PRIVILEGIO_ALUMNO, idInformacionPersonal); 
                    daoCuentas.cerrarConexionACuentas();
                    
                    DAOInformacionAlumno daoInformacionAlumno = new DAOInformacionAlumno();
                    int claveInformacionAlumno = daoInformacionAlumno.registrarInformacionPersonal(alumno);
                    daoInformacionAlumno.cerrarConexionADAOInformacionAlumno();   
                    
                    DAOAlumno_PE daoAlumno_pe = new DAOAlumno_PE();
                    daoAlumno_pe.registrarAlumnoAPE(claveInformacionAlumno, claveProgramaEducativo);
                    daoAlumno_pe.cerrarConexionAReticulaAcademica();
                    
                    out.println("Registrado exitosamente");
//                    HttpSession sesion = request.getSession();
//                    sesion.setAttribute("nombreUsuario", nombreDeUsuario);
//                    
//                    RequestDispatcher despachador = request.getRequestDispatcher("/PotalAlumno.jsp");
//                    try { 
//                        despachador.forward(request, response);
//                    } catch (ServletException ex) {
//                        Logger.getLogger(GestorDeCuentasDeAlumno.class.getName()).log(Level.SEVERE, null, ex);
//                    }
                }
                else{
                    out.println("El nombre de usuario ingresado no est&aacute; disponible");
                }                
            }
            else{             
                out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
            }
            
        } catch (IOException ex) {
            Logger.getLogger(GestorDeCuentasDeAlumno.class.getName()).log(Level.SEVERE, null, ex);
            out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
        } finally {
            out.close();
        }
    }
    
    private void buscarCuentaDeAlumno(HttpServletRequest request, HttpServletResponse response){
        PrintWriter out = null;
        try {
            out = response.getWriter();
            String nombreDeUsuario = request.getParameter("nombre_usuario");
            if(nombreDeUsuario != null){        
                try {
                    DAOCuentas daoCuentas = new DAOCuentas();
                    ResultSet resultSetCuenta = daoCuentas.buscarInformacionPersonalDeCuenta(nombreDeUsuario, PRIVILEGIO_ALUMNO);
                    
                    String contrasenia = "";
                    
                    int contadorDeRegistros = 0;
                    while(resultSetCuenta.next()){
                        contrasenia = resultSetCuenta.getString(2);
                        
                        contadorDeRegistros++;
                    }
                    
                    if(contadorDeRegistros == 0){
                        out.println("No se encontr&oacute; el alumno");
                    }
                    
                    daoCuentas.cerrarConexionACuentas();
                    
                } catch (SQLException ex) {
                    Logger.getLogger(GestorDeCuentasDeAlumno.class.getName()).log(Level.SEVERE, null, ex);
                    out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
                }
                
            }
            else{
                out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
            }
        } catch (IOException ex) {
            Logger.getLogger(GestorDeCuentasDeAlumno.class.getName()).log(Level.SEVERE, null, ex);
            out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
        } finally {
            out.close();
        }
    }
    
    private void modificarContraseniaDeAlumno(HttpServletRequest request, HttpServletResponse response){
        PrintWriter out = null;
        try {
            out = response.getWriter();            
            String nombreDeUsuario = (String) request.getSession().getAttribute("nombreUsuario");
            String contraseniaActualRecibida = request.getParameter("contraseniaActual");
            String contraseniaNueva = request.getParameter("contraseniaNueva");
            
            if(nombreDeUsuario != null && contraseniaActualRecibida != null && contraseniaNueva != null){
                
                DAOCuentas daoCuentas = new DAOCuentas();
                
                ResultSet resultSetCuentas = daoCuentas.buscarCuenta(nombreDeUsuario);
                String contraseniaActualEnBaseDeDatos = "";
                
                int contadorDeRegistros = 0;
                while(resultSetCuentas.next()){
                    contraseniaActualEnBaseDeDatos = resultSetCuentas.getString(2); 
                    
                    contadorDeRegistros++;
                }
                
                if(contadorDeRegistros == 0){
                    out.println("No se encontr&oacute; el alumno");
                }
                else{
                    if(contraseniaActualEnBaseDeDatos.equals(contraseniaActualRecibida)){                                                
                        daoCuentas.actualizarContraseniaDeCuenta(nombreDeUsuario, contraseniaNueva); 
                        out.println("Contrase&ntilde;a modificada exitosamente");
                    }
                    else{
                        out.println("La contrase&ntilde;a actual no es la registrada en la base de datos");
                    }
                }
                daoCuentas.cerrarConexionACuentas();
            }
            else{
                out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
            }
        } catch (SQLException ex) {
            Logger.getLogger(GestorDeCuentasDeAlumno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(GestorDeCuentasDeAlumno.class.getName()).log(Level.SEVERE, null, ex);
            out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
        } finally {
            out.close();
        }
    }
    
    private void eliminarCuentaDeAlumno(HttpServletRequest request, HttpServletResponse response){
        PrintWriter out = null;
        try {
            out = response.getWriter();
            String nombreDeUsuario = (String) request.getSession().getAttribute("nombreUsuario");
            String contraseniaActualRecibida = request.getParameter("contraseniaActual");          
            
            if(nombreDeUsuario != null && contraseniaActualRecibida != null ){
                
                DAOCuentas daoCuentas = new DAOCuentas();
                
                ResultSet resultSetCuentas = daoCuentas.buscarCuenta(nombreDeUsuario);
                String contraseniaActualEnBaseDeDatos = "";
                
                int contadorDeRegistros = 0;
                while(resultSetCuentas.next()){
                    contraseniaActualEnBaseDeDatos = resultSetCuentas.getString(2); 
                    
                    contadorDeRegistros++;
                }
                
                if(contadorDeRegistros == 0){
                    out.println("No se encontr&oacute; el alumno");
                }
                else{
                    if(contraseniaActualEnBaseDeDatos.equals(contraseniaActualRecibida)){
                        
                        DAOInformacionAlumno daoInformacionAlumno = new DAOInformacionAlumno();
                        int claveInformacionAlumno = daoInformacionAlumno.obtenerClaveInfoAlumno(nombreDeUsuario);
                        daoInformacionAlumno.cerrarConexionADAOInformacionAlumno();
                        
                        DAORelacionAlumnoProgramaEducativo daoRelacionAlumnoPE = new DAORelacionAlumnoProgramaEducativo();
                        int claveRelacionAlumnoPE = daoRelacionAlumnoPE.obtenerClaveRelacionAlumnoPE(claveInformacionAlumno);
                        daoRelacionAlumnoPE.cerrarConexionARelacionAlumnoProgramaEducativo();
                        
                        DAOAsignaturasAlumno daoAsignaturasAlumno = new DAOAsignaturasAlumno();
                        daoAsignaturasAlumno.eliminarAsignaturasDelAlumno(claveRelacionAlumnoPE); 
                        daoAsignaturasAlumno.cerrarConexionAAsignaturaAlumno();
                        
                        DAOAsignaturasOptativasAlumno daoAsignaturasOptativasAlumno = new DAOAsignaturasOptativasAlumno();
                        daoAsignaturasOptativasAlumno.eliminarAsignaturasDelAlumno(claveRelacionAlumnoPE);
                        daoAsignaturasOptativasAlumno.cerrarConexionAAsignaturaOptativaAlumno();
                        
                        DAOAlumno_PE daoAlumnoPE = new DAOAlumno_PE();
                        daoAlumnoPE.eliminarRelacionAlumnoPE(claveInformacionAlumno);
                        daoAlumnoPE.cerrarConexionAReticulaAcademica();
                        
                        daoCuentas.eliminarCuenta(nombreDeUsuario);  
                        
                        request.getSession().invalidate();
                        out.println("Cuenta eliminada exitosamente");                        
                    }
                    else{
                        out.println("La contrase&ntilde;a actual no es la registrada en la base de datos");
                    }
                }
                daoCuentas.cerrarConexionACuentas();
            }
            else{
                out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
            }
        } catch (SQLException ex) {
            Logger.getLogger(GestorDeCuentasDeAlumno.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(GestorDeCuentasDeAlumno.class.getName()).log(Level.SEVERE, null, ex);
            out.println("Ocurri&oacute; un error al procesar la petici&oacute;n");
        } finally {
            out.close();
        }
    }
}
